// ============================== 导入依赖 ============================== //

import MAP from '../MAP'

// ============================== 导出校验工具 ============================== //

export default {
  /**
   * 校验链接是否有效
   *
   * @param {String} link 链接
   *
   * @returns {Boolean} true/false
   */
  validLink(link = '') {
    return MAP.REG_LINK.test(link)
  },

  /**
   * 校验邮箱是否有效
   *
   * @param {String} email 邮箱
   *
   * @returns {Boolean} true/false
   */
  validEmail(email = '') {
    return MAP.REG_EMAIL.test(email)
  },

  /**
   * 校验姓名是否有效
   *
   * @param {String} name 姓名
   *
   * @returns {Boolean} true/false
   */
  validName(name = '') {
    return MAP.REG_NAME.test(name)
  },

  /**
   * 校验手机号是否有效
   *
   * @param {String} phone 手机号
   *
   * @returns {Boolean} true/false
   */
  validPhone(phone = '') {
    return MAP.REG_PHONE.test(phone)
  },

  /**
   * 校验车牌号是否有效
   *
   * @param {String} carNo 车牌号
   *
   * @returns {Boolean} true/false
   */
  validCarNo(carNo = '') {
    return MAP.REG_CAR_NO.test(carNo)
  },

  /**
   * 校验身份证号码是否有效
   *
   * @param {String} idNo 身份证号码
   *
   * @returns {Boolean} true/false
   */
  validIdNo(idNo = '') {
    if (!MAP.REG_ID_NO.test(idNo)) return false
    if (!validBirthday(idNo)) return false
    if (!validLast(idNo)) return false
    return true
  },

  /**
   * 校验旧版身份证号码是否有效
   *
   * @param {String} idNo 身份证号码
   *
   * @returns {Boolean} true/false
   */
  validIdNoOld(idNo = '') {
    if (!MAP.REG_ID_NO_OLD.test(idNo)) return false
    if (!validBirthday(idNo)) return false
    if (!validLast(idNo)) return false
    return true
  },
}

// ============================== 内部变量 ============================== //

const WEIGHT = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] // 权重值
const RIGHT = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] // 正确码

// ============================== 内部方法 ============================== //

/**
 * 检查出生日期
 *
 * @param {String} idNo 身份证号码
 *
 * @returns 正确 true / 错误 false
 */
const validBirthday = (idNo) => {
  const date = idNo.replace(/.{6}(.{4})(.{2})(.{2}).{4}/, '$1-$2-$3')
  if (new Date(date).getTime() > Date.now()) return false

  const rightDay = new Date(date).getDate()
  if (rightDay !== +date.slice(-2)) return false

  return true
}

/**
 * 检查末位校验码
 *
 * @param {String} idNo 身份证号码
 *
 * @returns 正确 true / 错误 false
 */
const validLast = (idNo) => {
  let result = 0
  WEIGHT.forEach((w, i) => (result += idNo.charAt(i) * w))
  return idNo.charAt(17) === RIGHT[result % 11]
}
